#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

vector<int> edge[501];
queue<int> result_queue;
priority_queue<int, vector<int>, greater<int>> data_queue;

int main(int argc, char const* argv[])
{
    int n, m;
    int degree[501];
    while (scanf("%d %d", &n, &m) != EOF) {
        //初始化
        for (int i = 1; i <= n; i++) {
            degree[i] = 0;
            edge[i].clear();
        }
        //输入
        for (int i = 0; i < m; i++) {
            int a, b;
            scanf("%d %d", &a, &b);
            edge[a].push_back(b);
            degree[b]++;
        }

        //clear
        while (!data_queue.empty())
            data_queue.pop();

        //入度为0的结点入队
        for (int i = 1; i <= n; i++) {
            if (degree[i] == 0)
                data_queue.push(i);
        }

        while (!data_queue.empty()) {
            int now_node = data_queue.top();
            result_queue.push(now_node);
            data_queue.pop();
            for (int i = 0; i < edge[now_node].size(); i++) {
                degree[edge[now_node][i]]--;
                if (degree[edge[now_node][i]] == 0)
                    data_queue.push(edge[now_node][i]);
            }
        }
        bool flag = false;
        while (!result_queue.empty()) {
            if (!flag) {
                cout << result_queue.front();
                flag = true;
            } else
                cout << ' ' << result_queue.front();
            result_queue.pop();
        }
        cout << endl;
    }
    return 0;
}